CONTENTS
The C64 Emulator
ALEC64 is a Commodore 64 emulator. ALEC64 is written
in C.
Following ports exists.
- Linux with XFree86
- Linux with svgalib
- SCO Unix with VGA console
- DOS with GO32
Choose your installation directory
For example: /usr/games.
Unpack the archive
tar vxzf alec64-x.xx.tar.gz
x.xx is replaced by the version number.
Build rom image
You need the image of the C64 BASIC ROM, C64 KERNEL ROM and C64
CHARACTER ROM to run the emulator. This images must be in the
original form, exactly 8192 or 4096 bytes, no extra
informations.
If you don't know how to get this images, read the comp.emulators.cbm
FAQ.
cat basic kernel character > romimage.c64
-or-
cat original.64b original.64k original.64.c > romimages.c64
basic, kernal and character are the names of your ROM images.
Choose the correct executable
- c64-svga-sp
- C64 for svgalib with speaker.
- c64-svga-vs-sp
- C64 for svgalib with video-sync and speaker.
- c64-svga-os-vs-sp
- C64 for svgalib with overscan, video-sync and speaker.
- c64-x11-sp
- C64 for X11 with speaker.
- c64-x11-vs-sp
- C64 for X11 with video-sync and speaker.
- c64-x11-os-vs-sp
- C64 for X11 with overscan, video-sync and speaker.
ln "selected version" c64
-or-
ln -s "selected version" c64
Test it
You can now start the emulator with
c64
To exit press ALT+PRINT.
Choose your installation directory
For example: \games.
Unpack the archive
tar vxzf alec64-x.xx.tar.gz
or
unzip ale64xxx.zip
x.xx or xxx is replaced by the version number.
Build rom image
You need the image of the C64 BASIC ROM, C64 KERNEL ROM and C64
CHARACTER ROM to run the emulator. This images must be in the
original form, exactly 8192 or 4096 bytes, no extra
informations.
If you don't know how to get this images, read the comp.emulators.cbm
FAQ.
copy /b basic+kernel+character romimage.c64
-or-
copy /b original.64b+original.64k+original.64.c romimage.c64
basic, kernal and character are the names of your ROM images.
Choose the correct executable
- c64-sp
- C64 version with speaker.
- c64-vs
- C64 version with video-sync and speaker.
copy "selected version" c64
Test it
You can now start the emulator with
c64
To exit press ALT+CTRL+DEL. (This will change in new versions)
c64 [-1] [-2] [-a name] [-c dir] [-d disk] [-e name] [-f n] [-F n]
[-g geometry] [-h] [-i roms] [-j] [-l lib] [prgid]
- -1
Use keypad as Joystick 1. (Not supported under X11)
- -2
Use keypad as Joystick 2. (Not supported under X11)
- -a pathname
Load the C64 file 'pathname' automatic at startup.
- -c path
Change to the directory 'path' for the emulator.
- -d pathname
Use floppy disk image 'pathname' as diskette.
- -e pathname
Load the C64 image 'pathname' as external ROM.
- -f n
Change the VIC fetch irq position to 'n'.
- -F n
Change the VIC fetch read position to 'n'.
- -g geometry
Geometry of the X11 window.
- -h
Display a short help for command line options.
- -i pathname
Use the ROM image 'pathname' for ROMS.
- -j
Enable hardware joystick.
- -l pathname
Use library file 'pathname' as database.
- prgid
Lookup 'prgid' in library database and start it.
Examples
c64 -1
Start c64 and use keypad as joystick 1.
You can use following environment variables to runtime
configure ALEC64.
- C64LIB
Use this library file 'pathname' as database.
- C64IMAGE
Use this ROM image 'pathname' for ROMS.
- C64EXROM
Use this C64 ROM image 'pathname' as external ROM.
- C64AUTOLOAD
Load this C64 binary file 'pathname' at startup.
- C64PRINTCMD
Use this os program 'pathname' as printer filter.
- C64DIR
Use this directory 'pathname' as working directory for C64. All releative
paths are relative to this directory.
Examples
SH (Unix)
C64DIR=/usr/games/c64
export C64DIR
CSH (Unix)
setenv C64DIR /usr/games/c64
Use the directory '/usr/games/c64' as start for relative pathes.
c64 -c psi-5 changes to the directory '/usr/games/c64/psi-5'.
DOS
C64DIR=\games\c64
Use the directory '\usr\games\c64' as start for relative pathes.
c64 -c psi-5 changes to the directory '\games\c64\psi-5'.
Keyboard layout used for emulation. I use a layout very simular to the
original layout.
Picture keyboard layout
<- 1! 2" 3# 4$ 5% 6& 7' 8( 9) 0 + - __DEL_
CTRL q w e r t y u i o p q * RET_
RUN STOP a s d f g h j k l :[ ;] = RET
SHIFT °1 z x c v b n m ,< .> /? RIGHTSHIFT
CTRL C= |_________SPACE_________| C= CTRL
°1 is arrow-up and pi. On 101 keyboards use PAGE-DOWN.
The following keys have a special meaning for ALEC64.
Keys used for C64
- F1 F2 F3 F4 F5 F6 F7 F8
- The C64 functions keys
- Caps-Lock
- RUN/STOP
- Left shift
- LEFT SHIFT
- Right shift
- RIGHT SHIFT
- Left Alt and Right Alt
- C=
- Left control, Right control and TAB
- CONTROL
- Home
- HOME
- End
- RESTORE
- Delete and Backspace
- DEL
- Insert
- SHIFT DEL
- Page up
- POUND
- Page down
- UP-ARROW and PI
- Arrow keys
- The C64 cursor keys
Keys used for the emulator
- F9
- Decrements VicFetch
- SHIFT + F9
- Increments VicFetch
- F10
- Decrements VicFetchAdd
- SHIFT + F10
- Increments VicFetchAdd
- F11
- Toggles the sound emulation on/off
- F12
- Enters the builtin machine monitor
- PRINT
- Toggle autofire on/off
- SCROLL-LOCK
- Change update rate ( 1 ->2 ->3 ->4 ->1 )
- SHIFT + SCROLL-LOCK
- Change emulation rate ( 1 ->2 ->3 ->4 ->1 )
- PAUSE
-
- NUM-LOCK
- Toggles emulation of joystick 1 or 2
- Keypad 1 2 3 4 6 7 8 9
- Joystick direction
- Keypad 5 and ESC
- Joystick fire (ESC can have Autofire, Keypad-5 never)
- Alt-Ctrl-Print, sys-request
- Leave emulator. (Linux)
- Alt-Ctrl-Delete
- Leave emulator. (DOS, will be changed!)
- Ctrl-Pause, Intr.
- Reset emulator.
The joysticks of the C64 are emulated with the keyboard.
- ESC (Escape)
Joystick fire (repeated with AUTOFIRE).
- Keypad 1
Joystick down and left.
- Keypad 2
Joystick down.
- Keypad 3
Joystick down and right.
- Keypad 4
Joystick left.
- Keypad 5
Joystick fire (not repeated with AUTOFIRE).
- Keypad 6
Joystick right.
- Keypad 7
Joystick up and left.
- Keypad 8
Joystick up.
- Keypad 9
Joystick up and right.
You can control the joystick emulation with:
- Num-lock
Toggles joystick 1 or 2 emulation.
- PRINT
Toggles autofire on or off (PAL: 25Hz or NTSC: 30Hz).
- Commandline: -1
Keypad emulates joystick port 1. (not under X11)
- Commandline: -2
Keypad emulates joystick port 2. (not under X11)
Under X11 the joystick emulations depends of the num-lock state.
6510
The opcodes counts cycles and all hardware timings are calculate at this
base.
Supported features
- All opcodes are supported
- All addressing modes
- Peripheral port at $0/$1
- Most used illegal opcodes
- Memory wrap
- ($FF),Y and ($FF,X) bug
- jmp ($xxFF) bug
Missing features
- Correct decimal mode
- All illegal 6510 opcodes
- Correct cycles for page boundary crossing
- Read-Modify-Write write unmodified data, then modified
- Illegal read of indexed addressing
SID
The SID is implemented as hook in the vertical retrace, this means
the emulation is called 50 or 60 times per second.
(New versions should use a closer timing.)
Since sound isn't really needed to play, the SID emulation isn't
perfect.
We support emulations for 3 different hardwares.
- PC Speaker
- DSP 8bit sampled data
- OPL3 FM synth chip
PC Speaker
This was very easy to implement and makes a good sound. In each
vertical retrace the SID emulations is called.
DSP 8bit sampled data
This is only available for the linux port.
The SID sound is sampled with 22050 Hz and played using '/dev/dsp'.
Currently only the correct wave forms are support, the correct
envelope forms are missing.
OPL3 FM synth chip
Be currently developed.
VIC
The VIC is implemented on a rasterline basis. This means every 63-65
cycles the 6510 emulation is stopped and a display line is drawn.
Supported features
- All video modes
- Normal text mode
- Multicolor text mode
- Extended color text mode
- Normal bitmap mode
- Multicolor bitmap mode
- Illegal modes
Gives a black display.
- Complete sprite emulation
- Normal sprites
- Multicolor sprites
- X and Y size doubling
- Sprite-Sprite and Sprite-Background collision and interrupts
- Sprite priority
- Multiplexed sprites
- 38 or 40 columns mode
- 24 or 25 lines mode
- Splitscreens
- Raster interrupts
- Open vertical borders
(Only under linux port supported)
- Blank mode
- X and Y smooth scroll register
- Correct cycle stealing for bad-lines and sprites
- Idle state
(VIC displays the contents of $3FFF of the current video bank)
- FLD (flexible line distance)
- FLI (flexible line interpretation)
- Linecrunch
- Dynamic X scrolling
(creature 1 use it)
Missing features
- In line modifies
- The correct line fetch position
Internals of VIC emulation
video-sync
The ALEC64 Emulator runs with a virtual cpu clock, all hardware
timings depends on the virtual cpu clock. If you have a fast computer
(486DX4/100 or above) the emulator is much to fast. To reduce it to
the original speed, I use video-sync
. This means each video frame
is syncronised to 1/50s (PAL) or 1/60s (NTSC).
The 1541 is emulated on the filesystem. The disk image emulation is
missing.
The files on the filesystem could be in binary or P00 format.
You can change the directory for the 1541 emulation with
- 1541 command "G:directory".
- Commandline: -c directory
- Monitor: w directory
ALEC64 has a builtin maschine language monitor.
You can disassemble, display and modify the C64 memory.
You can enter the builtin monitor with 'F12'.
This are the builtin commands.
- ?
Show all monitor commands.
- a from to
- w directory
Working directory of the 1541 emulation.
- X
eXit ALEC64 emulator.
- FIXME: more to document.
Files
This are the files used by the emulator.
- autoload.c64
- C64 file loaded by start of the emulator
- external.c64
- The external cartridge ROM image
- lib.c64
- The C64 program library base
- romimage.c64
- Combined ROM images of the C64
- snapshot.c64
- Snapshot image
- dirfile.c64
- Contains mapping of operating system file names to C64
File formats
romimage.c64
ROM Images
8192 Bytes Basic ROM $A000-$BFFF
8192 Bytes Kernel ROM $E000-$FFFF
4096 Bytes Character ROM $C000-$DFFF
dirfile.c64
Filename conversion
os-name type "c64-name"
- os-name
- Is the operating system filename. (for DOS 8 character + 3 extension)
- type
- Is the C64 type of the file ( prg, seq, usr or del ).
- "c64-name"
- Is the C64 file name enclosed in double quotes.
Examples
# Disk 2001
sprites prg "sprites"
name.c64 prg "a name with space"
CPU MOS 6510
VIC II MOS 6567 (NTSC) or 6569 (PAL)
SID MOS 6581 or 8580
SID CONTROL REGISTERS
There are 29 eight-bit registers in SID which control the generation of sound.
These registers are either WRITE-only or READ-only and are listed below in
Table 1.
Table 1. SID Register Map
REG # DATA REG NAME TYPE
(Hex) d7 d6 d5 d4 d3 d2 d1 d0
- --------------------------------------------------------------------
Voice 1:
00 F7 F6 F5 F4 F3 F2 F1 F0 FREQ LO Write
01 F15 F14 F13 F12 F11 F10 F9 F8 FREQ HI Write
02 PW7 PW6 PW5 PW4 PW3 PW2 PW1 PW0 PW LO Write
03 - - - - PW11 PW10 PW9 PW8 PW HI Write
04 NSE PUL SAW TRI TEST RING SYNC GATE CONTROL Write
05 ATK3 ATK2 ATK1 ATK0 DCY3 DCY2 DCY1 DCY0 ATK/DCY Write
06 STN3 STN2 STN1 STN0 RLS3 RLS2 RLS1 RLS0 STN/RLS Write
Voice 2:
07 F7 F6 F5 F4 F3 F2 F1 F0 FREQ LO Write
08 F15 F14 F13 F12 F11 F10 F9 F8 FREQ HI Write
09 PW7 PW6 PW5 PW4 PW3 PW2 PW1 PW0 PW LO Write
0A - - - - PW11 PW10 PW9 PW8 PW HI Write
0B NSE PUL SAW TRI TEST RING SYNC GATE CONTROL Write
0C ATK3 ATK2 ATK1 ATK0 DCY3 DCY2 DCY1 DCY0 ATK/DCY Write
0D STN3 STN2 STN1 STN0 RLS3 RLS2 RLS1 RLS0 STN/RLS Write
Voice 3:
0E F7 F6 F5 F4 F3 F2 F1 F0 FREQ LO Write
0F F15 F14 F13 F12 F11 F10 F9 F8 FREQ HI Write
10 PW7 PW6 PW5 PW4 PW3 PW2 PW1 PW0 PW LO Write
11 - - - - PW11 PW10 PW9 PW8 PW HI Write
12 NSE PUL SAW TRI TEST RING SYNC GATE CONTROL Write
13 ATK3 ATK2 ATK1 ATK0 DCY3 DCY2 DCY1 DCY0 ATK/DCY Write
14 STN3 STN2 STN1 STN0 RLS3 RLS2 RLS1 RLS0 STN/RLS Write
Filter:
15 - - - - - FC2 FC1 FC0 FC LO Write
16 FC10 FC9 FC8 FC7 FC6 FC5 FC4 FC3 FC HI Write
17 RES3 RES2 RES1 RES0 FILEX FILT3 FILT2 FILT1 RES/FILT Write
18 3 OFF HP BP LP VOL3 VOL2 VOL1 VOL0 MODE/VOL Write
Misc.:
19 PX7 PX6 PX5 PX4 PX3 PX2 PX1 PX0 POT X Read
1A PY7 PY6 PY5 PY4 PY3 PY2 PY1 PY0 POT Y Read
1B O7 O6 O5 O4 O3 O2 O1 O0 OSC3/RND Read
1C E7 E6 E5 E4 E3 E2 E1 E0 ENV3 Read
Table 2. SID Envelope Rates
VALUE ATTACK RATE DECAY/RELEASE RATE
Time/Cycle Time/Cycle
- ------------------------------------------
0 2 ms 6 ms
1 8 ms 24 ms
2 16 ms 48 ms
3 24 ms 72 ms
4 38 ms 114 ms
5 56 ms 168 ms
6 68 ms 204 ms
7 80 ms 240 ms
8 100 ms 300 ms
9 240 ms 750 ms
10 500 ms 1.5 s
11 800 ms 2.4 s
12 1 s 3 s
13 3 s 9 s
14 5 s 15 s
15 8 s 24 s
NOTE: Envelope rates are based on a 1.0 MHz ø2 clock. For other
ø2 frequencies, multiply the given rate by 1 MHz/ø2.
The rates refer to the amount of time per cycle. For example, given an ATTACK
value of 2, the ATTACK cycle would take 16 ms to rise from zero to peak
amplitude. The DECAY/RELEASE rates refer to the amount of time theses cycles
would take to fall from peak amplitude to zero.
Picture 3. 6581 Envelope
/|\ - Reg 18: 0-3
/ | \ ^ Max. volume level
/ | \_____________ | - Reg 06,0D,14: 4-7
/ | | |\ | ^ Sustain level
/ | | | \ v v
-|---------|-----|------------|---|-- --- 0
| | | | |
|<------->|<--->| |<->|
| | Decay | Release
| Attack
Register description
Voice 1
- FREQ LO/FREQ HI (Registers 00,01)
- Together these registers form a 16-bit number which linearly controls the
frequency of oscillator 1. The frequency is determined by the following
equation:
Fout = (Fn * Fclk / 16777216) Hz
Where Fn is the 16-bit number in the frequency registers and Fclk is the
system clock applied to the ø2 input (pin 6).
For a standard PAL 0.985 MHz clock, the frequency is given by:
Fout = (Fn * 0.058725357) Hz
For a standard NTSC 1.023 MHz clock, the frequency is given by:
Fout = (Fn * 0.060959279) Hz
It should be noted that the frequency resolution of SID is sufficient for
any tuning scale and allows sweeping from note to note (portamento) with
no dicernable frequency steps.
- PW LO/PW HI (Registers 02,03)
- Together these registers form a 12-bit number (bits 4-7 of PW HI are
not used) which linearly controls the pulse width (duty cycle) of the pulse
waveform on Oscillator 1. The pulse width is determined by the following
equation:
PWout = (PWn/40.95) %
Where PWn is the 12-bit number in the Pulse Width registers. The pulse
width resolution allows the width to be smoothly swept with no discernable
stepping. Note that the pulse waveform on Oscillator 1 must be selected in
order for the pulse width registers to have any audible effect. A value of
0 or 4095 ($FFF) in the pulse width registers will produce a constant DC
output, while a value of 2048 ($800) will produce a square wave.
*********** FIXME: What is correct ***********
[A value of 4095 will not produce a constant DC output].
- CONTROL REGISTER (Register 04)
- This register contains eight control bits which select various options on
Oscillator 1.
One of the output waveforms must be selected for oscillator 1 to be audible,
however it is NOT nescessary to de-select waveforms to silence the output of
voice 1. The amplitude of voice 1 at the final output is a function of the
envelope generator only.
NOTE:
The oscillator output waveforms are NOT additive. If more than one
output waveform is selected simultaneously, the result will be a logical
ANDing of the waveforms.
[Transcriber's note: This is most probably wrong. Some claim that it is the
"min" function that is used, but my experience is that it is more complex than
that].
Although this technique can be used to generate additional waveforms beyond
the four listed above, it must be used with care. If any other waveform is
selected while noise is on, the noise output can "lock up". If this occurs,
the noise output will remain silent until reset by the TEST bit or by bringing
RES (pin 5) low.
FAQs
For more information read the following FAQs.
- comp.sys.cbm Commodore FTP sites list.
- comp.sys.cbm General FAQ.
- comp.emulators.cbm FAQ.
- comp.emulators.misc FAQ.
Send your bug reports, patches, improvements, questions and suggestions
to johns@av.rwth-aachen.de.
The ALE C64 emulator: Copyright (c) 1992-1996 by Andreas Arens,
Lutz Sammer and Edgar Törnig.